const fs = require('fs');
const path = require('path');

// 配置部分 - 可自定义
const config = {
    // 要排除的文件夹路径（可以是绝对路径或相对于当前目录的路径）
    excludePaths: [
        'C:/projects/important-project',  // 绝对路径示例
        './do-not-delete-this',           // 相对路径示例
        'node_modules/special-module'      // 特定 node_modules 子目录
    ].map(p => path.resolve(p)), // 转换为绝对路径

    // 是否启用模拟模式（只显示将要删除的内容，不实际删除）
    dryRun: false,

    // 是否显示详细日志
    verbose: true
};

/**
 * 检查路径是否在排除列表中
 * @param {string} targetPath 要检查的路径
 * @returns {boolean} 如果路径应该被排除则返回 true
 */
function isExcluded(targetPath) {
    return config.excludePaths.some(excludedPath => {
        return targetPath.startsWith(excludedPath);
    });
}

/**
 * 删除指定目录及其所有内容
 * @param {string} dirPath 要删除的目录路径
 */
function deleteDirectory(dirPath) {
    if (isExcluded(dirPath)) {
        config.verbose && console.log(`[跳过] 排除的目录: ${dirPath}`);
        return;
    }

    if (!fs.existsSync(dirPath)) {
        return;
    }

    if (config.dryRun) {
        console.log(`[模拟] 将删除目录: ${dirPath}`);
        return;
    }

    try {
        // Node.js 14+ 更高效的删除方法
        fs.rmSync(dirPath, { recursive: true, force: true });
        console.log(`[删除] 成功删除: ${dirPath}`);
    } catch (err) {
        console.error(`[错误] 删除失败 ${dirPath}:`, err.message);
    }
}

/**
 * 遍历目录查找并删除所有 node_modules 文件夹
 * @param {string} startPath 开始遍历的目录路径
 */
function findAndDeleteNodeModules(startPath) {
    if (isExcluded(startPath)) {
        config.verbose && console.log(`[跳过] 排除的根目录: ${startPath}`);
        return;
    }

    if (!fs.existsSync(startPath)) {
        console.log(`[警告] 目录不存在: ${startPath}`);
        return;
    }

    try {
        const files = fs.readdirSync(startPath);
        for (const file of files) {
            const fullPath = path.join(startPath, file);

            try {
                const stat = fs.lstatSync(fullPath);

                if (stat.isDirectory()) {
                    if (file === 'node_modules') {
                        deleteDirectory(fullPath);
                    } else {
                        // 递归遍历其他目录
                        findAndDeleteNodeModules(fullPath);
                    }
                }
            } catch (err) {
                console.error(`[错误] 访问 ${fullPath} 失败:`, err.message);
            }
        }
    } catch (err) {
        console.error(`[错误] 读取目录 ${startPath} 失败:`, err.message);
    }
}

// 主程序
function main() {
    const startDirectory = process.cwd(); // 或者指定一个绝对路径

    console.log('========================================');
    console.log('Node.js 清理 node_modules 工具');
    console.log(`开始目录: ${startDirectory}`);
    console.log(`排除路径: ${config.excludePaths.join('\n          ')}`);
    console.log(`模拟模式: ${config.dryRun ? '开启 (不会实际删除)' : '关闭 (将实际删除)'}`);
    console.log('========================================\n');

    findAndDeleteNodeModules(startDirectory);

    console.log('\n操作完成');
}

main();